from PIL import ImageGrab
import sys, os
import configparser
from win32com.client import DispatchEx
import pythoncom
import time

ini_file = 'dms-screenshot.ini'

#函数功能：截取excel文件多个区域，生成对应多个.PNG图片
#参数说明：
#filename：excel文件名（包括完整路径）
#sheetname：excel文件的sheet页名称
#screen_area：截图区域，以列表形式存储。取值例如：['A1:M11','A13:L23','A26:L36']，表示分别截取3个区域：A1到M11、A13到L23、A26到L36
#picture_name：生成截图的文件名（包括完整路径），以列表形式存储，程序会加上.PNG后缀。取值例如：['E:/pic1','E:/pic2','E:/pic3']
#flag：是否需要继续处理的标记，Y表示中间出现异常，没有生成全部截图，需要再调用此函数，处理未生成的截图；N表示全部处理完成
def excel_catch_screen(filename, sheetname, screen_area, sleep_time):
    pythoncom.CoInitialize()  #excel多线程相关
    try:
        excel = DispatchEx("Excel.Application")  #启动excel
        excel.Visible = True  #可视化
        excel.DisplayAlerts = False  #是否显示警告
        
        wb = excel.Workbooks.Open(filename)  #打开excel
        ws = wb.Sheets(sheetname)  #选择sheet
        time.sleep(int(sleep_time))
        wb.RefreshAll()
        picture_name=os.path.dirname(filename) + "\\" + str(os.path.basename(filename)).split(".")[0]
        print(picture_name)
		#循环处理每个截图区域
        for i in range (0,len(screen_area)):
            ws.Range(screen_area[i]).CopyPicture()  #复制图片区域
            ws.Paste()  #粘贴           
            excel.Selection.ShapeRange.Name = picture_name + str(i) #将刚刚选择的Shape重命名，避免与已有图片混淆
            ws.Shapes(picture_name + str(i)).Cut()  # 剪切选择图片
            # ws.Shapes(picture_name + str(i)).Copy()  # 复制选择图片
            # ws.Shapes(picture_name + str(i)).Delete()  # 删除选择图片
            img = ImageGrab.grabclipboard()  # 获取剪贴板的图片数据
            img_name = picture_name + str(i) + ".png" #生成图片的文件名
            img.save(img_name)  #保存图片
            # #记录已处理的截图区域
            # x=screen_area[i]
            # #将已处理的截图区域从列表移除
            # area_list.remove(x)
            # #记录已处理的截图名称
            # y=picture_name[i]
            # #将已处理的截图名称从列表移除
            # picture_list.remove(y)
            # #打印日志
            # print('移除区域：' + x + ' 移除图片：' +y)
            # print('剩余计数：'+ str(len(screen_area))+' ' +str(len(picture_name)))
	    
    except Exception as e:	    
        print('error is:',e) #打印异常日志
    finally:
        wb.Close(SaveChanges=0)  #关闭工作薄，不保存
        excel.Quit()  #退出excel
        pythoncom.CoUninitialize()



if __name__ == '__main__':

    # BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    BASE_DIR = os.path.abspath("./")
    # BASE_DIR = os.getcwd()
    print(BASE_DIR)
    # 创建配置文件对象
    con = configparser.ConfigParser()

    # 读取文件
    con.read(os.path.join(BASE_DIR,ini_file), encoding='utf-8')
    print(os.path.join(BASE_DIR,ini_file))

    input_dir = con.get('file','input_dir')
    sheet_name = con.get('file','sheet_name')
    jpg_area = con.get('file','jpg_area')
    sleep_time = con.get('file','sleep_time')


    if os.path.isdir(input_dir):
        file_name_dict = {}
        for path, dirs, files in os.walk(input_dir):
            for file in files:
                file_name_dict[file] = file.split('_')
                input_file_path = os.path.join(path, file)
                if input_file_path.endswith('.xls') or input_file_path.endswith('.xlsx'):
                    excel_catch_screen(input_file_path, sheet_name, jpg_area.split(","), sleep_time)
    else:
        if os.path.isfile(input_dir):
            if input_dir.endswith('.xls') or input_dir.endswith('.xlsx'):
                    excel_catch_screen(input_dir, sheet_name, jpg_area.split(","), sleep_time)
        else:
            print(f'{input_dir} is not a folder or the folder does not exist.')
            sys.exit(1)



